package com.LA_houseLease.common.utils;
import com.LA_houseLease.common.exception.houseLeaseException;
import com.LA_houseLease.common.result.ResultCodeEnum;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;

import javax.crypto.SecretKey;
import java.util.Date;

/**
 * JWT工具类
 */
public class JwtUtil {

    /**
     * 生成JWT
     * @param secretKey 密钥
     * @param Ttl 过期时间（毫秒）
     * @param userId  用户id
     * @param username  用户名
     * @return
     */
    public static String creatToken(String secretKey,Long Ttl,Long userId,String username){
        //生成密钥
        SecretKey key = Keys.hmacShaKeyFor(secretKey.getBytes());

        //生成JWT时间
        long expMillis = System.currentTimeMillis() + Ttl;
        Date exp=new Date(expMillis);

        String jwt = Jwts.builder()
                .setExpiration(exp)   //设置过期时间
                .signWith(SignatureAlgorithm.HS256, key) //设置签名所使用的签名算法和签名使用的密钥
                .claim("userId", userId) //自定义内容
                .claim("username", username)
                .compact();
        return jwt;
    }



    /**
     * 解析token
     * @param secretKey
     * @param token
     */
    public static Claims parseJWT(String secretKey,String token){
        //生成密钥
        SecretKey key = Keys.hmacShaKeyFor(secretKey.getBytes());

        //如果token为空说明用户没有登录
        if(token==null){
            throw new houseLeaseException(ResultCodeEnum.ADMIN_LOGIN_AUTH);
        }
        //根据解析过程是否抛异常来校验token是否合法
        try{
            //解析出来的就是我们的payload
            Jws<Claims> claimsJws = Jwts.parserBuilder()
                    .setSigningKey(key) //传入之前加密的密钥（会根据header,payload以及这个密钥重新加密与signature进行验证，来校验是否合法）
                    .build() //构建解析器
                    .parseClaimsJws(token);// 解析token
            return claimsJws.getBody();
        }catch (ExpiredJwtException e){
            throw new houseLeaseException(ResultCodeEnum.TOKEN_EXPIRED);//token过期异常
        }catch (JwtException e){
            throw new houseLeaseException(ResultCodeEnum.TOKEN_INVALID);
        }
    }
}












